--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RNS/Utilities/rngit/client.py 85d77c10a11ff0e943b100ef86fb5cbfa791c8b3 (85d77c10) Text, 28.89 KB
T8b949e#!/usr/bin/env python3
T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2016-2026 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.
Tff7b72import T7ee787RNS
Tff7b72import T7ee787os
Tff7b72import T7ee787sys
Tff7b72import T7ee787time
Tff7b72import T7ee787shutil
Tff7b72import T7ee787threading
Tff7b72import T7ee787subprocess
Tff7b72from T7ee787RNST7ee787.T7ee787_version Tff7b72import Te6edf3__version__
Tff7b72from T7ee787RNST7ee787.T7ee787UtilitiesT7ee787.T7ee787rngit Tff7b72import Te6edf3APP_NAME
Tff7b72from T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787configobj Tff7b72import Te6edf3ConfigObj
Tff7b72from T7ee787tempfile Tff7b72import Te6edf3TemporaryDirectory
Tff7b72def Td2a8ffprogram_setupTb4b4b4(Te6edf3configdirTb4b4b4, Te6edf3rnsconfigdirTb4b4b4, Te6edf3destination_hexhashTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4)Tb4b4b4:
Te6edf3git_client Tff7b72= Te6edf3ReticulumGitClientTb4b4b4(Te6edf3configdirTff7b72=Te6edf3configdirTb4b4b4, Te6edf3rnsconfigdirTff7b72=Te6edf3rnsconfigdirTb4b4b4, Te6edf3destination_hexhashTff7b72=Te6edf3destination_hexhashTb4b4b4,
Te6edf3group_nameTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTff7b72=Te6edf3repo_nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3git_clientTff7b72.Td2a8ffreadyTb4b4b4: Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3git_clientTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3sysTff7b72.Td2a8ffargvTb4b4b4) Tff7b72< T79c0ff3Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffUsage: git-remote-rns <remote-name> <url>Ta5d6ff"Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3url Tff7b72= Te6edf3sysTff7b72.Td2a8ffargvTb4b4b4[T79c0ff2Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3urlTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffrns://Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid URL scheme. Must be rns://Ta5d6ff"Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3parts Tff7b72= Te6edf3urlTb4b4b4[T79c0ff6Tb4b4b4:Tb4b4b4]Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)
Te6edf3destination_hexhash Tff7b72= Te6edf3partsTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3group_name Tff7b72= Te6edf3partsTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3repo_name Tff7b72= Te6edf3partsTb4b4b4[T79c0ff2Tb4b4b4]
Tff7b72except Tf85149IndexErrorTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid URL format. Use rns://<hash>/<group>/<repo>Ta5d6ff"Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)Tb4b4b4; Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3configdir Tff7b72= Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffRNGIT_CONFIGTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3rnsconfigdir Tff7b72= Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffRNS_CONFIGTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3program_setupTb4b4b4(Te6edf3configdirTb4b4b4, Te6edf3rnsconfigdirTb4b4b4, Te6edf3destination_hexhashTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72class T56d364ReticulumGitClientTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3PATH_LIST Tff7b72= Ta5d6ff"Ta5d6ff/git/listTa5d6ff"
Te6edf3PATH_FETCH Tff7b72= Ta5d6ff"Ta5d6ff/git/fetchTa5d6ff"
Te6edf3PATH_PUSH Tff7b72= Ta5d6ff"Ta5d6ff/git/pushTa5d6ff"
Te6edf3PATH_DELETE Tff7b72= Ta5d6ff"Ta5d6ff/git/deleteTa5d6ff"
Te6edf3RES_DISALLOWED Tff7b72= T79c0ff0x01
Te6edf3RES_INVALID_REQ Tff7b72= T79c0ff0x02
Te6edf3RES_NOT_FOUND Tff7b72= T79c0ff0x03
Te6edf3RES_REMOTE_FAIL Tff7b72= T79c0ff0xFF
Te6edf3IDX_REPOSITORY Tff7b72= T79c0ff0x00
Te6edf3IDX_RESULT_CODE Tff7b72= T79c0ff0x01
Te6edf3REF_BATCH_SIZE Tff7b72= T79c0ff25
Te6edf3PATH_TIMEOUT Tff7b72= T79c0ff15
Te6edf3LINK_TIMEOUT Tff7b72= T79c0ff15
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3configdirTb4b4b4, Te6edf3rnsconfigdirTb4b4b4, Te6edf3destination_hexhashTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4)Tb4b4b4:
T8b949e# Client state and configuration
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffuserdir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Ta5d6ff"Ta5d6ff~Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffready Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffremote_identity Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fflink_ready Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fflink_failed Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fflink_timeout Tff7b72= Tff7b72selfTff7b72.Td2a8ffLINK_TIMEOUT
Tff7b72selfTff7b72.Td2a8ffpath_timeout Tff7b72= Tff7b72selfTff7b72.Td2a8ffPATH_TIMEOUT
Tff7b72selfTff7b72.Td2a8ffdestination_hexhash Tff7b72= Te6edf3destination_hexhash
Tff7b72selfTff7b72.Td2a8ffgroup_name Tff7b72= Te6edf3group_name
Tff7b72selfTff7b72.Td2a8ffrepo_name Tff7b72= Te6edf3repo_name
Tff7b72selfTff7b72.Td2a8ffrepo_path Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff"
Tff7b72selfTff7b72.Td2a8fftmp_dir Tff7b72= Te6edf3TemporaryDirectoryTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrequest_event Tff7b72= Te6edf3threadingTff7b72.Td2a8ffEventTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrequest_response Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffresponse_metadata Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffref_batch_size Tff7b72= Tff7b72selfTff7b72.Td2a8ffREF_BATCH_SIZE
Tff7b72selfTff7b72.Td2a8ffremote_refs Tff7b72= Tb4b4b4{Tb4b4b4}
T8b949e# Response progress tracking
Tff7b72selfTff7b72.Td2a8ffresponse_progress Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffprevious_progress Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffresponse_size Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffresponse_transfer_size Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffprogress_updated_at Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffprogress_enabled Tff7b72= Tff7b72False
Tff7b72if Te6edf3configdir Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8ffconfigdir Tff7b72= Te6edf3configdir
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/rngitTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/rngit/configTa5d6ff"Tb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffconfigdir Tff7b72= Tff7b72selfTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.rngit/reticulumTa5d6ff"
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffconfigdir Tff7b72= Tff7b72selfTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.rngitTa5d6ff"
Tff7b72selfTff7b72.Td2a8fflogfile Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/client_logTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffconfigpath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/client_configTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffidentitypath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/client_identityTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogfile Tff7b72= Tff7b72selfTff7b72.Td2a8fflogfile
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffreticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdirTff7b72=Te6edf3rnsconfigdirTb4b4b4, Te6edf3logdestTff7b72=Te6edf3RNSTff7b72.Td2a8ffLOG_FILETb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFailed to initialize Reticulum: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Tff7b72return
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Te6edf3ConfigObjTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not parse the configuration at Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ff__create_default_configTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__apply_configTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffready Tff7b72= Tff7b72True
Tff7b72def Td2a8ff__create_default_configTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Te6edf3ConfigObjTb4b4b4(Te6edf3__default_rngit_config__Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8fffilename Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigpath
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigdirTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigdirTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffwriteTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff__apply_configTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffloggingTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Te6edf3section Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffloglevelTa5d6ff" Tff7b72in Te6edf3sectionTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72= Tffa657maxTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_NONETb4b4b4, Tffa657minTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4, Te6edf3sectionTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffloglevelTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffclientTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Te6edf3section Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffref_batch_sizeTa5d6ff" Tff7b72in Te6edf3sectionTb4b4b4: Tff7b72selfTff7b72.Td2a8ffref_batch_size Tff7b72= Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Tffa657minTb4b4b4(T79c0ff1024Tb4b4b4, Te6edf3sectionTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffref_batch_sizeTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4)Tb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3identityTff7b72.Td2a8ffto_fileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffClient identity generated and persisted to Tffd700{Tff7b72selfTff7b72.Td2a8ffidentitypathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffClient identity loaded from Tffd700{Tff7b72selfTff7b72.Td2a8ffidentitypathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72if Tff7b72not Te6edf3identityTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not initialize client identity.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffready Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3identity
Tff7b72def Td2a8ffabortTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3reasonTff7b72=Tff7b72NoneTb4b4b4, Te6edf3codeTff7b72=T79c0ff255Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3reasonTb4b4b4: Te6edf3reason Tff7b72= Ta5d6ff"Ta5d6ffUnknown reasonTa5d6ff"
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffgit-remote-rns failed: Tffd700{Te6edf3reasonTffd700}Ta5d6ff"Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4: Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(Te6edf3codeTb4b4b4)
Tff7b72def Td2a8ffconnect_serverTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hexhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid destination hash: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRequesting path to Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRequesting path...Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffawait_pathTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffpath_timeoutTb4b4b4)Tb4b4b4:
Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not resolve path to Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPath to Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tffd700}Ta5d6ff resolvedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)Tb4b4b4;
Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\rTa5d6ffPath resolved Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffremote_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffremote_identityTb4b4b4: Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6ff"Ta5d6ffCould not recall remote identity. Is the server announcing?Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\rTa5d6ffEstablishing link...Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Tff7b72selfTff7b72.Td2a8ffremote_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffrepositoriesTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestinationTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffset_link_established_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8fflink_establishedTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffset_link_closed_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8fflink_closedTb4b4b4)
Tff7b72def Td2a8fflink_establishedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffLink established, identifying...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\rTa5d6ffLink established with remoteTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffidentifyTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflink_ready Tff7b72= Tff7b72True
Tff7b72def Td2a8fflink_closedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffLink was closedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fflink_readyTb4b4b4: Tff7b72selfTff7b72.Td2a8fflink_failed Tff7b72= Tff7b72True
Tff7b72def Td2a8ff_on_progressTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3transfer_instanceTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3transfer_instanceTb4b4b4, Ta5d6ff"Ta5d6ffprogressTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffresponse_progress Tff7b72= Te6edf3transfer_instanceTff7b72.Td2a8ffprogress
Tff7b72selfTff7b72.Td2a8ffresponse_size Tff7b72= Te6edf3transfer_instanceTff7b72.Td2a8ffresponse_size
Tff7b72selfTff7b72.Td2a8ffresponse_transfer_size Tff7b72= Te6edf3transfer_instanceTff7b72.Td2a8ffresponse_transfer_size
Tff7b72elif Tffa657hasattrTb4b4b4(Te6edf3transfer_instanceTb4b4b4, Ta5d6ff"Ta5d6ffget_progressTa5d6ff"Tb4b4b4) Tff7b72and Tffa657callableTb4b4b4(Te6edf3transfer_instanceTff7b72.Td2a8ffget_progressTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffresponse_progress Tff7b72= Te6edf3transfer_instanceTff7b72.Td2a8ffget_progressTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffresponse_size Tff7b72= Te6edf3transfer_instanceTff7b72.Td2a8fftotal_size
Tff7b72selfTff7b72.Td2a8ffresponse_transfer_size Tff7b72= Te6edf3transfer_instanceTff7b72.Td2a8ffsize
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffprogress_updated_at Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8ffprogress_updated_at Tff7b72= Te6edf3now
Tff7b72if Te6edf3now Tff7b72> Tff7b72selfTff7b72.Td2a8ffprogress_updated_atTff7b72+T79c0ff1Tb4b4b4:
Te6edf3td Tff7b72= Te6edf3now Tff7b72- Tff7b72selfTff7b72.Td2a8ffprogress_updated_at
Te6edf3pd Tff7b72= Tff7b72selfTff7b72.Td2a8ffresponse_progress Tff7b72- Tff7b72selfTff7b72.Td2a8ffprevious_progress
Te6edf3bd Tff7b72= Te6edf3pdTff7b72*Tff7b72selfTff7b72.Td2a8ffresponse_size Tff7b72if Tff7b72selfTff7b72.Td2a8ffresponse_size Tff7b72else T79c0ff0
Tff7b72selfTff7b72.Td2a8ffresponse_speed Tff7b72= Tb4b4b4(Te6edf3bdTff7b72/Te6edf3tdTb4b4b4)Tff7b72*T79c0ff8 Tff7b72if Te6edf3td Tff7b72> T79c0ff0 Tff7b72else T79c0ff0
Tff7b72selfTff7b72.Td2a8ffprevious_progress Tff7b72= Tff7b72selfTff7b72.Td2a8ffresponse_progress
Tff7b72selfTff7b72.Td2a8ffprogress_updated_at Tff7b72= Te6edf3now
T8b949e# Report progress to git via stderr
Tff7b72if Tff7b72selfTff7b72.Td2a8ffprogress_enabled Tff7b72and Tff7b72selfTff7b72.Td2a8ffresponse_sizeTb4b4b4:
Te6edf3percent Tff7b72= Tffa657roundTb4b4b4(Tff7b72selfTff7b72.Td2a8ffresponse_progress Tff7b72* T79c0ff100Tb4b4b4, T79c0ff1Tb4b4b4)
Te6edf3size Tff7b72= Tff7b72selfTff7b72.Td2a8ffresponse_size
Te6edf3rxd Tff7b72= Te6edf3sizeTff7b72*Tff7b72selfTff7b72.Td2a8ffresponse_progress
Te6edf3speed_kbps Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffresponse_speed Tff7b72/ T79c0ff1024Tb4b4b4) Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff'Ta5d6ffresponse_speedTa5d6ff'Tb4b4b4) Tff7b72else T79c0ff0
Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTransferring: Tffd700{Te6edf3percentTffd700}Ta5d6ff% (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3rxdTb4b4b4)Tffd700}Ta5d6ff/Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3sizeTb4b4b4)Tffd700}Ta5d6ff) Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyspeedTb4b4b4(Tff7b72selfTff7b72.Td2a8ffresponse_speedTb4b4b4)Tffd700}Ta5d6ff Tffea00\rTa5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
T8b949e################################
T8b949e# Synchronous Request Wrappers #
T8b949e################################
Tff7b72def Td2a8ff_response_readyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3request_receiptTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrequest_response Tff7b72= Te6edf3request_receiptTff7b72.Td2a8ffresponse
Tff7b72selfTff7b72.Td2a8ffresponse_metadata Tff7b72= Te6edf3request_receiptTff7b72.Td2a8ffmetadata
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrequest_responseTb4b4b4, Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4) Tff7b72and Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrequest_responseTff7b72.Td2a8ffreadTb4b4b4)Tb4b4b4:
Te6edf3response_path Tff7b72= Tff7b72selfTff7b72.Td2a8ffrequest_responseTff7b72.Td2a8ffname
Te6edf3base_name Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3response_pathTb4b4b4)
Te6edf3retained_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8fftmp_dirTff7b72.Td2a8ffnameTb4b4b4, Te6edf3base_nameTb4b4b4)
Te6edf3shutilTff7b72.Td2a8ffmoveTb4b4b4(Te6edf3response_pathTb4b4b4, Te6edf3retained_pathTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrequest_response Tff7b72= Tffa657openTb4b4b4(Te6edf3retained_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrequest_eventTff7b72.Td2a8ffsetTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_response_failedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3request_receiptTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrequest_response Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrequest_eventTff7b72.Td2a8ffsetTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffsend_requestTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3timeoutTff7b72=T79c0ff7200Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fflink_readyTb4b4b4: Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6ff"Ta5d6ffLink not ready for requestTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrequest_eventTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrequest_response Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffresponse_metadata Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffprevious_progress Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffprogress_updated_at Tff7b72= Tff7b72None
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSending request: Tffd700{Te6edf3pathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3request_receipt Tff7b72= Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffrequestTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3progress_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ff_on_progressTb4b4b4, Te6edf3response_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ff_response_readyTb4b4b4, Te6edf3failed_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ff_response_failedTb4b4b4, Te6edf3timeoutTff7b72=Te6edf3timeoutTb4b4b4)
Tff7b72if Te6edf3request_receiptTff7b72.Td2a8ffresourceTb4b4b4: Te6edf3request_receiptTff7b72.Td2a8ffresourceTff7b72.Td2a8ffprogress_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_on_progressTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrequest_eventTff7b72.Td2a8ffwaitTb4b4b4(Te6edf3timeoutTff7b72=Te6edf3timeoutTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrequest_response Tff7b72is Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6ff"Ta5d6ffRequest failed or timed outTa5d6ff"Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffGot response for: Tffd700{Te6edf3pathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrequest_responseTb4b4b4, Tff7b72selfTff7b72.Td2a8ffresponse_metadata
T8b949e#############################
T8b949e# Git Helper Protocol Logic #
T8b949e#############################
Tff7b72def Td2a8ff_detach_stdoutTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3sysTff7b72.Td2a8ffstdout Tff7b72= Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffdevnullTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstderr Tff7b72= Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffdevnullTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffrunTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffconnect_serverTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3timeout Tff7b72= Tff7b72selfTff7b72.Td2a8fflink_timeout
Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8fflink_ready Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8fflink_failed Tff7b72and Te6edf3timeout Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.5Tb4b4b4)
Te6edf3timeout Tff7b72-Tff7b72= T79c0ff1
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fflink_readyTb4b4b4: Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6ff"Ta5d6ffFailed to establish linkTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffprogress_enabled Tff7b72= Tff7b72False
Te6edf3git_stdin Tff7b72= Te6edf3sysTff7b72.Td2a8ffstdin
Te6edf3git_stdout Tff7b72= Te6edf3sysTff7b72.Td2a8ffstdout
Te6edf3git_stderr Tff7b72= Te6edf3sysTff7b72.Td2a8ffstderr
Te6edf3fetch_queue Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3push_queue Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3line Tff7b72= Te6edf3git_stdinTff7b72.Td2a8ffreadlineTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3lineTb4b4b4: Tff7b72break
Te6edf3line Tff7b72= Te6edf3lineTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3line Tff7b72== Ta5d6ff"Ta5d6ffcapabilitiesTa5d6ff"Tb4b4b4:
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6fflistTffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6fffetchTffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffpushTffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffoptionTffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3line Tff7b72== Ta5d6ff"Ta5d6fflistTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffhandle_git_listTb4b4b4(Te6edf3git_stdoutTb4b4b4)
Tff7b72elif Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6fflist Ta5d6ff"Tb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffhandle_git_listTb4b4b4(Te6edf3git_stdoutTb4b4b4, Te6edf3for_pushTff7b72=Tff7b72TrueTb4b4b4) T8b949e# List for push
Tff7b72elif Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffoptionTa5d6ff"Tb4b4b4)Tb4b4b4:
T8b949e# Line format: option <name> <value>
Te6edf3parts Tff7b72= Te6edf3lineTff7b72.Td2a8ffsplitTb4b4b4(Te6edf3maxsplitTff7b72=T79c0ff2Tb4b4b4)
Te6edf3opt_name Tff7b72= Te6edf3partsTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72if Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tff7b72> T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3opt_value Tff7b72= Te6edf3partsTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72if Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tff7b72> T79c0ff2 Tff7b72else Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3opt_name Tff7b72== Ta5d6ff"Ta5d6ffprogressTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffprogress_enabled Tff7b72= Te6edf3opt_valueTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6fftrueTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffyesTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffokTffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffunsupportedTffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6fffetchTa5d6ff"Tb4b4b4)Tb4b4b4:
T8b949e# Line format: fetch <sha> <ref>
Te6edf3parts Tff7b72= Te6edf3lineTff7b72.Td2a8ffsplitTb4b4b4(Tb4b4b4)
Te6edf3sha Tff7b72= Te6edf3partsTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3ref Tff7b72= Te6edf3partsTb4b4b4[T79c0ff2Tb4b4b4]
T8b949e# Avoid duplicates in the same batch - TODO: Re-evaluate this
Tff7b72if Tb4b4b4(Te6edf3shaTb4b4b4, Te6edf3refTb4b4b4) Tff7b72not Tff7b72in Te6edf3fetch_queueTb4b4b4: Te6edf3fetch_queueTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3shaTb4b4b4, Te6edf3refTb4b4b4)Tb4b4b4)
Te6edf3push_queue Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72elif Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffpushTa5d6ff"Tb4b4b4)Tb4b4b4:
T8b949e# Line format: push <local_ref>:<remote_ref>
Te6edf3parts Tff7b72= Te6edf3lineTff7b72.Td2a8ffsplitTb4b4b4(Tb4b4b4)
Te6edf3refspec Tff7b72= Te6edf3partsTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3local_refTb4b4b4, Te6edf3remote_ref Tff7b72= Te6edf3refspecTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff:Ta5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4)
Te6edf3push_queueTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3local_refTb4b4b4, Te6edf3remote_refTb4b4b4)Tb4b4b4)
Te6edf3fetch_queue Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72elif Te6edf3line Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4: T8b949e# End of batch
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprocess_fetch_queueTb4b4b4(Te6edf3fetch_queueTb4b4b4, Te6edf3git_stdoutTb4b4b4, Tff7b72selfTff7b72.Td2a8ffprogress_enabledTb4b4b4, Tff7b72selfTff7b72.Td2a8ffref_batch_sizeTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffprocess_push_queueTb4b4b4(Te6edf3push_queueTb4b4b4, Te6edf3git_stdoutTb4b4b4, Te6edf3git_stderrTb4b4b4, Tff7b72selfTff7b72.Td2a8ffprogress_enabledTb4b4b4)
Te6edf3fetch_queue Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3push_queue Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149BrokenPipeErrorTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_detach_stdoutTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffGit closed connection, exitingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72break
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffUnknown Git command: Tffd700{Te6edf3lineTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149BrokenPipeErrorTb4b4b4: Tff7b72pass
Tff7b72if Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4: Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffhandle_git_listTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3git_stdoutTb4b4b4, Te6edf3for_pushTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffHandle git listTa5d6ff" Tff7b72+ Tb4b4b4(Ta5d6ff"Ta5d6ff for-pushTa5d6ff" Tff7b72if Te6edf3for_push Tff7b72else Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3request_data Tff7b72= Tb4b4b4{Tff7b72selfTff7b72.Td2a8ffIDX_REPOSITORYTb4b4b4: Tff7b72selfTff7b72.Td2a8ffrepo_pathTb4b4b4, Ta5d6ff"Ta5d6fffor_pushTa5d6ff"Tb4b4b4: Te6edf3for_pushTb4b4b4}
Te6edf3responseTb4b4b4, Te6edf3metadata Tff7b72= Tff7b72selfTff7b72.Td2a8ffsend_requestTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_LISTTb4b4b4, Te6edf3request_dataTb4b4b4)
Tff7b72if Tff7b72not Te6edf3response Tff7b72or Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3responseTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6ff"Ta5d6ffInvalid list response from serverTa5d6ff"Tb4b4b4)
Te6edf3status_byte Tff7b72= Te6edf3responseTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3payload Tff7b72= Te6edf3responseTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]
Tff7b72if Te6edf3status_byte Tff7b72!= T79c0ff0Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffServer refused list: Tffd700{Te6edf3payloadTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff'Ta5d6ffignoreTa5d6ff'Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3response_text Tff7b72= Te6edf3payloadTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffremote_refs Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3line Tff7b72in Te6edf3response_textTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3line Tff7b72= Te6edf3lineTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3lineTb4b4b4: Tff7b72continue
Te6edf3parts Tff7b72= Te6edf3lineTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tff7b72== T79c0ff2Tb4b4b4:
Te6edf3shaTb4b4b4, Te6edf3ref_name Tff7b72= Te6edf3parts
Tff7b72if Te6edf3ref_name Tff7b72== Ta5d6ff"Ta5d6ffHEADTa5d6ff"Tb4b4b4: Tff7b72continue
Tff7b72selfTff7b72.Td2a8ffremote_refsTb4b4b4[Te6edf3ref_nameTb4b4b4] Tff7b72= Te6edf3sha
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3response_textTb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4) T8b949e# Required to terminate list
Te6edf3git_stdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffescape_for_stdoutTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valueTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3valueTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4: Te6edf3value Tff7b72= Te6edf3valueTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff'Ta5d6ffreplaceTa5d6ff'Tb4b4b4)
Te6edf3escaped Tff7b72= Ta5d6ff'Ta5d6ff"Ta5d6ff'
Tff7b72for Te6edf3char Tff7b72in Te6edf3valueTb4b4b4:
Tff7b72if Te6edf3char Tff7b72== Ta5d6ff'Tffea00\\Ta5d6ff'Tb4b4b4: Te6edf3escaped Tff7b72+Tff7b72= Ta5d6ff'Tffea00\\Tffea00\\Ta5d6ff'
Tff7b72elif Te6edf3char Tff7b72== Ta5d6ff'Ta5d6ff"Ta5d6ff'Tb4b4b4: Te6edf3escaped Tff7b72+Tff7b72= Ta5d6ff'Tffea00\\Ta5d6ff"Ta5d6ff'
Tff7b72elif Te6edf3char Tff7b72== Ta5d6ff'Tffea00\nTa5d6ff'Tb4b4b4: Te6edf3escaped Tff7b72+Tff7b72= Ta5d6ff'Tffea00\\Ta5d6ffnTa5d6ff'
Tff7b72elif Te6edf3char Tff7b72== Ta5d6ff'Tffea00\tTa5d6ff'Tb4b4b4: Te6edf3escaped Tff7b72+Tff7b72= Ta5d6ff'Tffea00\\Ta5d6fftTa5d6ff'
Tff7b72elif Te6edf3char Tff7b72== Ta5d6ff'Tffea00\rTa5d6ff'Tb4b4b4: Te6edf3escaped Tff7b72+Tff7b72= Ta5d6ff'Tffea00\\Ta5d6ffrTa5d6ff'
Tff7b72elif Tffa657ordTb4b4b4(Te6edf3charTb4b4b4) Tff7b72< T79c0ff32 Tff7b72or Tffa657ordTb4b4b4(Te6edf3charTb4b4b4) Tff7b72> T79c0ff126Tb4b4b4: Te6edf3escaped Tff7b72+Tff7b72= Ta5d6fffTa5d6ff'Tffea00\\Ta5d6ffxTffd700{Tffa657ordTb4b4b4(Te6edf3charTb4b4b4)Tffd700:Ta5d6ff02xTffd700}Ta5d6ff'
Tff7b72elseTb4b4b4: Te6edf3escaped Tff7b72+Tff7b72= Te6edf3char
Tff7b72return Te6edf3escaped Tff7b72+ Ta5d6ff'Ta5d6ff"Ta5d6ff'
Tff7b72def Td2a8ffprocess_fetch_queueTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3fetch_queueTb4b4b4, Te6edf3git_stdoutTb4b4b4, Te6edf3progress_enabledTff7b72=Tff7b72FalseTb4b4b4, Te6edf3ref_batch_sizeTff7b72=Te6edf3REF_BATCH_SIZETb4b4b4)Tb4b4b4:
Tff7b72import T7ee787tempfile
Tff7b72import T7ee787subprocess
Tff7b72if Tff7b72not Te6edf3fetch_queueTb4b4b4: Tff7b72return
T8b949e# Build a global have list from all remote refs that the client already has objects for
Te6edf3have_shas Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3sha Tff7b72in Tff7b72selfTff7b72.Td2a8ffremote_refsTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcat-fileTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-tTa5d6ff"Tb4b4b4, Te6edf3shaTb4b4b4]Tb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4: Te6edf3have_shasTff7b72.Td2a8ffappendTb4b4b4(Te6edf3shaTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not verify remote SHA Tffd700{Te6edf3shaTffd700}Ta5d6ff locally: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72while Te6edf3fetch_queueTb4b4b4:
Te6edf3batch Tff7b72= Te6edf3fetch_queueTb4b4b4[Tb4b4b4:Te6edf3ref_batch_sizeTb4b4b4]
Te6edf3fetch_queue Tff7b72= Te6edf3fetch_queueTb4b4b4[Te6edf3ref_batch_sizeTb4b4b4:Tb4b4b4]
Te6edf3refs_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3shaTb4b4b4, Te6edf3ref Tff7b72in Te6edf3batchTb4b4b4:
Te6edf3ref_entry Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffshaTa5d6ff"Tb4b4b4: Te6edf3shaTb4b4b4, Ta5d6ff"Ta5d6ffrefTa5d6ff"Tb4b4b4: Te6edf3refTb4b4b4}
Tff7b72tryTb4b4b4:
T8b949e# Attempt to get local ref SHA for incremental bundle generation on remote
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrev-parseTa5d6ff"Tb4b4b4, Te6edf3refTb4b4b4]Tb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3local_sha Tff7b72= Te6edf3resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3local_sha Tff7b72!= Te6edf3shaTb4b4b4: Te6edf3ref_entryTb4b4b4[Ta5d6ff"Ta5d6ffhaveTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3local_sha
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not resolve local SHA for Tffd700{Te6edf3refTffd700}Ta5d6ff during fetch enumeration, getting full history for this ref: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3refs_listTff7b72.Td2a8ffappendTb4b4b4(Te6edf3ref_entryTb4b4b4)
Te6edf3ref_names Tff7b72= Tb4b4b4[Te6edf3ref Tff7b72for Te6edf3_Tb4b4b4, Te6edf3ref Tff7b72in Te6edf3batchTb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFetching batch of Tffd700{Tffa657lenTb4b4b4(Te6edf3refs_listTb4b4b4)Tffd700}Ta5d6ff refs: Tffd700{Te6edf3ref_namesTffd700}Ta5d6ff (have Tffd700{Tffa657lenTb4b4b4(Te6edf3have_shasTb4b4b4)Tffd700}Ta5d6ff common objects)Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3request_data Tff7b72= Tb4b4b4{ Tff7b72selfTff7b72.Td2a8ffIDX_REPOSITORYTb4b4b4: Tff7b72selfTff7b72.Td2a8ffrepo_pathTb4b4b4, Ta5d6ff"Ta5d6ffrefsTa5d6ff"Tb4b4b4: Te6edf3refs_list Tb4b4b4}
Tff7b72if Te6edf3have_shasTb4b4b4: Te6edf3request_dataTb4b4b4[Ta5d6ff"Ta5d6ffhaveTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3have_shas
Te6edf3responseTb4b4b4, Te6edf3metadata Tff7b72= Tff7b72selfTff7b72.Td2a8ffsend_requestTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_FETCHTb4b4b4, Te6edf3request_dataTb4b4b4)
Tff7b72if Tff7b72not Te6edf3responseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo data in fetch response for batchTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3metadataTb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3responseTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid fetch response for batchTa5d6ff"Tb4b4b4)
Te6edf3status_byte Tff7b72= Te6edf3responseTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3status_byte Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffServer returned empty bundle, all objects already exist locallyTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72continue
Tff7b72elseTb4b4b4:
Te6edf3error_msg Tff7b72= Te6edf3responseTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff'Ta5d6ffignoreTa5d6ff'Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFetch failed for batch: Tffd700{Te6edf3error_msgTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffIDX_RESULT_CODE Tff7b72in Te6edf3metadataTb4b4b4: Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo result metadata on bundle responseTa5d6ff"Tb4b4b4)
Te6edf3status_byte Tff7b72= Te6edf3metadataTb4b4b4[Tff7b72selfTff7b72.Td2a8ffIDX_RESULT_CODETb4b4b4]
Tff7b72if Te6edf3status_byte Tff7b72== T79c0ff0Tb4b4b4: Te6edf3bundle_path Tff7b72= Te6edf3responseTff7b72.Td2a8ffname
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffUnknown remote state for batch ref fetchTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3progress_enabledTb4b4b4:
Te6edf3size Tff7b72= Te6edf3osTff7b72.Td2a8ffstatTb4b4b4(Te6edf3bundle_pathTb4b4b4)Tff7b72.Td2a8ffst_size
Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTransferring: 100% (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3sizeTb4b4b4)Tffd700}Ta5d6ff). Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3stderr_arg Tff7b72= Te6edf3sysTff7b72.Td2a8ffstderr Tff7b72if Te6edf3progress_enabled Tff7b72else Te6edf3subprocessTff7b72.Td2a8ffDEVNULL
Te6edf3verify_cmd Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbundleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffverifyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-qTa5d6ff"Tb4b4b4, Te6edf3bundle_pathTb4b4b4]
Te6edf3verify_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Te6edf3verify_cmdTb4b4b4, Te6edf3stderrTff7b72=Te6edf3subprocessTff7b72.Td2a8ffDEVNULLTb4b4b4, Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffDEVNULLTb4b4b4)
Tff7b72if Te6edf3verify_resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffBundle verification failed for batchTa5d6ff"Tb4b4b4)
Te6edf3unbundle_cmd Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbundleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffunbundleTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3progress_enabledTb4b4b4: Te6edf3unbundle_cmdTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ff--progressTa5d6ff"Tb4b4b4)
Te6edf3unbundle_cmdTff7b72.Td2a8ffappendTb4b4b4(Te6edf3bundle_pathTb4b4b4)
Te6edf3unbundle_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Te6edf3unbundle_cmdTb4b4b4, Te6edf3stderrTff7b72=Te6edf3stderr_argTb4b4b4, Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffDEVNULLTb4b4b4)
Tff7b72if Te6edf3unbundle_resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffabortTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffBundle unbundle failed for batch: Non-zero return codeTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffprocess_push_queueTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3push_queueTb4b4b4, Te6edf3git_stdoutTb4b4b4, Te6edf3git_stderrTb4b4b4, Te6edf3progress_enabledTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787tempfile
Tff7b72import T7ee787subprocess
Tff7b72for Te6edf3local_refTb4b4b4, Te6edf3remote_ref Tff7b72in Te6edf3push_queueTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPushing Tffd700{Te6edf3local_refTffd700}Ta5d6ff to Tffd700{Te6edf3remote_refTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
T8b949e# Handle potential deletions
Tff7b72if Tff7b72not Te6edf3local_ref Tff7b72or Te6edf3local_ref Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3request_data Tff7b72= Tb4b4b4{ Tff7b72selfTff7b72.Td2a8ffIDX_REPOSITORYTb4b4b4: Tff7b72selfTff7b72.Td2a8ffrepo_pathTb4b4b4, Ta5d6ff"Ta5d6ffrefTa5d6ff"Tb4b4b4: Te6edf3remote_ref Tb4b4b4}
Te6edf3responseTb4b4b4, Te6edf3metadata Tff7b72= Tff7b72selfTff7b72.Td2a8ffsend_requestTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_DELETETb4b4b4, Te6edf3request_dataTb4b4b4)
Tff7b72if Tff7b72not Te6edf3response Tff7b72or Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3responseTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4:
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6fferror Tffd700{Te6edf3remote_refTffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffescape_for_stdoutTb4b4b4(Ta5d6ff'Ta5d6ffNo response from serverTa5d6ff'Tb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72continue
Te6edf3status_byte Tff7b72= Te6edf3responseTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3status_byte Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3error_msg Tff7b72= Te6edf3responseTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff"Ta5d6ffignoreTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6fferror Tffd700{Te6edf3remote_refTffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffescape_for_stdoutTb4b4b4(Te6edf3error_msgTb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72continue
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffok Tffd700{Te6edf3remote_refTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72continue
Te6edf3force Tff7b72= Te6edf3local_refTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff+Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3forceTb4b4b4: Te6edf3local_ref Tff7b72= Te6edf3local_refTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]
Te6edf3stderr_arg Tff7b72= Te6edf3sysTff7b72.Td2a8ffstderr Tff7b72if Te6edf3progress_enabled Tff7b72else Te6edf3subprocessTff7b72.Td2a8ffDEVNULL
T8b949e# Resolve the SHA that local_ref points to
Te6edf3sha_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrev-parseTa5d6ff"Tb4b4b4, Te6edf3local_refTb4b4b4]Tb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3sha_resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3error_msg Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffCould not resolve local ref Tffd700{Te6edf3local_refTffd700}Ta5d6ff"
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6fferror Tffd700{Te6edf3remote_refTffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffescape_for_stdoutTb4b4b4(Te6edf3error_msgTb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72continue
Te6edf3local_sha Tff7b72= Te6edf3sha_resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Te6edf3bundle_empty Tff7b72= Tff7b72False
Tff7b72with Te6edf3tempfileTff7b72.Td2a8ffTemporaryDirectoryTb4b4b4(Tb4b4b4) Tff7b72as Te6edf3tmpdirTb4b4b4:
Te6edf3bundle_path Tff7b72= Te6edf3tmpdir Tff7b72+ Ta5d6ff"Ta5d6ff/push.bundleTa5d6ff"
Te6edf3create_cmd Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbundleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcreateTa5d6ff"Tb4b4b4, Te6edf3bundle_pathTb4b4b4, Te6edf3local_refTb4b4b4]
T8b949e# Exclude all remote ref SHAs that exist locally, so the
T8b949e# bundle only contains objects the remote doesn't already have
Te6edf3exclude_count Tff7b72= T79c0ff0
Tff7b72for Te6edf3sha Tff7b72in Tff7b72selfTff7b72.Td2a8ffremote_refsTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
T8b949e# We need to verify each SHA actually exists locally, since git
T8b949e# bundle create will fail if a ^<sha> argument references an object
T8b949e# not present in the local repository.
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcat-fileTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-tTa5d6ff"Tb4b4b4, Te6edf3shaTb4b4b4]Tb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3create_cmdTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff^Tffd700{Te6edf3shaTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3exclude_count Tff7b72+Tff7b72= T79c0ff1
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not verify remote SHA Tffd700{Te6edf3shaTffd700}Ta5d6ff locally: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffExcluding Tffd700{Te6edf3exclude_countTffd700}Ta5d6ff/Tffd700{Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffremote_refsTb4b4b4)Tffd700}Ta5d6ff remote refs for Tffd700{Te6edf3local_refTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Te6edf3progress_enabledTb4b4b4: Te6edf3create_cmdTff7b72.Td2a8ffinsertTb4b4b4(T79c0ff3Tb4b4b4, Ta5d6ff"Ta5d6ff--progressTa5d6ff"Tb4b4b4)
Te6edf3create_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Te6edf3create_cmdTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3create_resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3create_resultTff7b72.Td2a8ffstderrTb4b4b4:
T8b949e# git_stderr.write(create_result.stderr)
Tff7b72pass
Tff7b72elseTb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffempty bundleTa5d6ff" Tff7b72in Te6edf3create_resultTff7b72.Td2a8ffstderrTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e# All objects reachable from local_ref already exist on
T8b949e# the remote. In this case, no bundle is needed and we can
T8b949e# update the ref directly via the operations path instead.
Te6edf3bundle_empty Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffEmpty bundle for Tffd700{Te6edf3local_refTffd700}Ta5d6ff, all objects already on remoteTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3progress_enabled Tff7b72and Te6edf3create_resultTff7b72.Td2a8ffstderrTb4b4b4: Te6edf3git_stderrTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3create_resultTff7b72.Td2a8ffstderrTb4b4b4)
Te6edf3error_msg Tff7b72= Ta5d6ff"Ta5d6ffBundle creation failedTa5d6ff"
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6fferror Tffd700{Te6edf3remote_refTffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffescape_for_stdoutTb4b4b4(Te6edf3error_msgTb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72continue
Tff7b72if Tff7b72not Te6edf3bundle_emptyTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3bundle_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4: Te6edf3bundle_data Tff7b72= Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3request_data Tff7b72= Tb4b4b4{ Tff7b72selfTff7b72.Td2a8ffIDX_REPOSITORYTb4b4b4: Tff7b72selfTff7b72.Td2a8ffrepo_pathTb4b4b4, Ta5d6ff"Ta5d6fflocal_refTa5d6ff"Tb4b4b4: Te6edf3local_refTb4b4b4, Ta5d6ff"Ta5d6ffremote_refTa5d6ff"Tb4b4b4: Te6edf3remote_refTb4b4b4,
Ta5d6ff"Ta5d6ffforceTa5d6ff"Tb4b4b4: Te6edf3forceTb4b4b4, Ta5d6ff"Ta5d6ffbundleTa5d6ff"Tb4b4b4: Te6edf3bundle_data Tb4b4b4}
Te6edf3responseTb4b4b4, Te6edf3metadata Tff7b72= Tff7b72selfTff7b72.Td2a8ffsend_requestTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_PUSHTb4b4b4, Te6edf3request_dataTb4b4b4)
Tff7b72if Tff7b72not Te6edf3response Tff7b72or Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3responseTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4:
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6fferror Tffd700{Te6edf3remote_refTffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffescape_for_stdoutTb4b4b4(Ta5d6ff'Ta5d6ffNo response from serverTa5d6ff'Tb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72continue
Te6edf3status_byte Tff7b72= Te6edf3responseTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3status_byte Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3error_msg Tff7b72= Te6edf3responseTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff'Ta5d6ffignoreTa5d6ff'Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6fferror Tffd700{Te6edf3remote_refTffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffescape_for_stdoutTb4b4b4(Te6edf3error_msgTb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72continue
T8b949e# When all reachable objects already exist on the remote, send a
T8b949e# direct ref update operation instead of a bundle.
Tff7b72if Te6edf3bundle_emptyTb4b4b4:
Te6edf3operation Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffactionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffupdate_refTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrefTa5d6ff"Tb4b4b4: Te6edf3remote_refTb4b4b4, Ta5d6ff"Ta5d6ffshaTa5d6ff"Tb4b4b4: Te6edf3local_shaTb4b4b4, Ta5d6ff"Ta5d6ffforceTa5d6ff"Tb4b4b4: Te6edf3forceTb4b4b4}
Te6edf3request_data Tff7b72= Tb4b4b4{ Tff7b72selfTff7b72.Td2a8ffIDX_REPOSITORYTb4b4b4: Tff7b72selfTff7b72.Td2a8ffrepo_pathTb4b4b4,
Ta5d6ff"Ta5d6ffoperationsTa5d6ff"Tb4b4b4: Tb4b4b4[Te6edf3operationTb4b4b4] Tb4b4b4}
Te6edf3responseTb4b4b4, Te6edf3metadata Tff7b72= Tff7b72selfTff7b72.Td2a8ffsend_requestTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_PUSHTb4b4b4, Te6edf3request_dataTb4b4b4)
Tff7b72if Tff7b72not Te6edf3response Tff7b72or Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3responseTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4:
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6fferror Tffd700{Te6edf3remote_refTffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffescape_for_stdoutTb4b4b4(Ta5d6ff'Ta5d6ffNo response from serverTa5d6ff'Tb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72continue
Te6edf3status_byte Tff7b72= Te6edf3responseTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3status_byte Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3error_msg Tff7b72= Te6edf3responseTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff'Ta5d6ffignoreTa5d6ff'Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6fferror Tffd700{Te6edf3remote_refTffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffescape_for_stdoutTb4b4b4(Te6edf3error_msgTb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72continue
Te6edf3git_stdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffok Tffd700{Te6edf3remote_refTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3git_stdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3__default_rngit_config__ Tff7b72= Ta5d6ff'''Ta5d6ff# This is the default rngit client config file.
Ta5d6ff[client]
Ta5d6ff# You can control the batch size of ref transfers
Ta5d6ff# using the ref_batch_size directive:
Ta5d6ffref_batch_size = 25
Ta5d6ff[logging]
Ta5d6ff# Valid log levels are 0 through 7:
Ta5d6ff# 0: Log only critical information
Ta5d6ff# 1: Log errors and lower log levels
Ta5d6ff# 2: Log warnings and lower log levels
Ta5d6ff# 3: Log notices and lower log levels
Ta5d6ff# 4: Log info and lower (this is the default)
Ta5d6ff# 5: Verbose logging
Ta5d6ff# 6: Debug logging
Ta5d6ff# 7: Extreme logging
Ta5d6ffloglevel = 4
Ta5d6ff'''Tff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4: Te6edf3mainTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────